保护 JavaScript 源代码
可以通过将应用程序的 JavaScript 源代码编译为原生代码并由 NW.js 加载来保护 JavaScript 源代码。您只需在生产环境中将编译后的代码与您的应用程序一起分发。
编译
JS 源代码使用工具 nwjc
编译为原生代码,该工具在 SDK 构建中提供。
要使用它
nwjc source.js binary.bin
*.bin
文件需要与您的应用程序一起分发。您可以随意命名它。
如果您正在编译模块,则需要 --nw-module
参数。
加载已编译的 JavaScript
nw.Window.get().evalNWBin(frame, 'binary.bin');
win.evalNWBin() 方法的参数与
Window.eval()
方法类似,其中第一个参数是目标 iframe(对于主框架为 null
),第二个参数是二进制代码文件。
如果您正在为模块加载二进制文件,则应使用 win.evalNWBinModule()。
从远程加载已编译的 JavaScript
编译后的 JavaScript 可以从远程获取(例如使用 AJAX)并在运行时执行。
var xhr = new XMLHttpRequest(); xhr.responseType = 'arraybuffer'; // make response as ArrayBuffer xhr.open('GET', url, true); xhr.send(); xhr.onload = () => { // xhr.response contains compiled JavaScript as ArrayBuffer nw.Window.get().evalNWBin(null, xhr.response); }
注意
编译后的代码在 浏览器上下文 中执行。您可以使用任何 Web API(例如 DOM)以及 访问 NW.js API 和 Node API,就像在浏览器上下文运行的其他脚本一样。
在 Web Workers 中使用
在 worker 上下文中引入了一个名为 `importNWBin(ArrayBuffer)` 的函数。二进制文件可以在主线程中读取到数组缓冲区,然后发布到 worker,并使用新函数在那里执行。
已知问题
在 0.22 版本之前,编译后的代码运行速度 **比普通 JS 慢**:根据 v8bench,性能下降约 30%。其他未编译的 JS 源代码不受影响。在 0.22.0-beta1 中,此问题已修复。请查看我们的博客文章:https://nw.js.cn/blog/js-src-protect-perf/
编译后的代码 **不跨平台,也不兼容不同版本的 NW.js**。因此,在打包应用程序时,需要为每个平台运行 `nwjc`。